<?php

namespace CMS\Model;

use Think\Model;

/**
 * 文档分类模型
 */
class Category extends Model
{
    
    protected $name = 'cms_category';
    protected $tableName = 'category';

    protected function _initialize()
    {
        $this->addBothRule('name', 'require', '标识不能为空')
            ->addBothRule('name', '', '标识已经存在', 'unique')
            ->addBothRule('title', 'require', '名称不能为空')
            ->addBothRule('keywords', '0,255', '网页关键字不能超过255个字符', 'length')
            ->addBothRule('meta_title', '0,255', '网页描述不能超过255个字符', 'length')
        ;
        
        $this->addBothAuto('model', 'arr2str', 'function')
            ->addBothAuto('model', null, 'ignore')
            ->addBothAuto('extend', 'json_encode', 'function')
            ->addBothAuto('extend', null, 'ignore')
            ->addInsertAuto('create_time', NOW_TIME)
            ->addBothAuto('update_time', NOW_TIME)
            ->addBothAuto('status', '1')
            ->addBothAuto('model_sub', 'arr2str', 'function')
            ->addBothAuto('model_sub', null, 'ignore')
            ->addBothAuto('type', 'arr2str', 'function')
            ->addBothAuto('type', null, 'ignore')
            ->addBothAuto('reply_model', 'arr2str', 'function')
            ->addBothAuto('reply_model', null, 'ignore')
        ;
    }

    /**
     * 获取分类详细信息
     * 
     * @param milit $id 分类ID或标识
     * @param boolean $field 查询字段
     * @return array 分类信息
     */
    public function info($id, $field = true)
    {
        /* 获取分类信息 */
        $map = array();
        if (is_numeric($id)) { // 通过ID查询
            $map['id'] = $id;
        } else { // 通过标识查询
            $map['name'] = $id;
        }
        return $this->field($field)->where($map)->find();
    }

    /**
     * 获取分类树，指定分类则返回指定分类极其子分类，不指定则返回所有分类树
     * 
     * @param integer $id 分类ID
     * @param boolean $field 查询字段
     * @return array 分类树
     */
    public function getTree($id = 0, $field = true)
    {
        /* 获取当前分类信息 */
        if ($id) {
            $info = $this->info($id);
            $id = $info['id'];
        }
        
        /* 获取所有分类 */
        $map = array(
            'status' => array(
                'gt',
                - 1
            )
        );
        $list = $this->field($field)
            ->where($map)
            ->order('sort')
            ->select();
        $list = list_to_tree($list, 'id', 'pid', '_', $id);
        
        /* 获取返回数据 */
        if (isset($info)) { // 指定分类则返回当前分类极其子分类
            $info['_'] = $list;
        } else { // 否则返回所有分类
            $info = $list;
        }
        
        return $info;
    }

    /**
     * 获取指定分类子分类ID
     * 
     * @param string $cate 分类ID
     * @return string id列表
     */
    public function getChildrenId($cate)
    {
        $field = 'id,name,pid,title,link_id';
        $category = $this->getTree($cate, $field);
        $ids[] = $cate;
        foreach ($category['_'] as $key => $value) {
            $ids[] = $value['id'];
        }
        return implode(',', $ids);
    }

    /**
     * 获取指定分类的同级分类
     * 
     * @param integer $id 分类ID
     * @param boolean $field 查询字段
     * @return array
     */
    public function getSameLevel($id, $field = true)
    {
        $info = $this->info($id, 'pid');
        $map = array(
            'pid' => $info['pid'],
            'status' => 1
        );
        return $this->field($field)
            ->where($map)
            ->order('sort')
            ->select();
    }

    /**
     * 更新分类信息
     * 
     * @return boolean 更新状态
     */
    public function update()
    {
        $data = $this->create();
        if (! $data) { // 数据对象创建错误
            return false;
        }
        
        /* 添加或更新数据 */
        if (empty($data['id'])) {
            $res = $this->add();
        } else {
            $res = $this->save();
        }
        
        // 更新分类缓存
        S('sys_category_list', null);
        
        // 记录行为
        action_log('update_category', 'category', $data['id'] ? $data['id'] : $res, UID);
        
        return $res;
    }

    /**
     * 查询后解析扩展信息
     * 
     * @param array $data 分类数据
     */
    protected function _after_find(&$data, $options)
    {
        /* 分割模型 */
        if (! empty($data['model'])) {
            $data['model'] = explode(',', $data['model']);
        }
        
        if (! empty($data['model_sub'])) {
            $data['model_sub'] = explode(',', $data['model_sub']);
        }
        
        /* 分割文档类型 */
        if (! empty($data['type'])) {
            $data['type'] = explode(',', $data['type']);
        }
        
        /* 分割模型 */
        if (! empty($data['reply_model'])) {
            $data['reply_model'] = explode(',', $data['reply_model']);
        }
        
        /* 分割文档类型 */
        if (! empty($data['reply_type'])) {
            $data['reply_type'] = explode(',', $data['reply_type']);
        }
        
        /* 还原扩展数据 */
        if (! empty($data['extend'])) {
            $data['extend'] = json_decode($data['extend'], true);
        }
    }
}
